[11] 模組 Module


Posted by bessyhuang on 2023-07-08

💡 模組 (Module):一個獨立的程式檔案。
   將程式寫在一個檔案中,此檔案可被其他程式碼『重複』載入『使用』。

套件 Package VS. 模組 Module

  • 套件 Package
    • 一個容器(資料夾),包含了一個或多個的模組(Module),並且擁有 __init__.py 檔案。
  • 模組 Module
    • 一個檔案,包含了相關性較高的程式碼。

隨著應用程式的開發規模越來越大,我們不可能把所有的程式碼都寫在同一份 Python 檔案中,一定會將關聯性較高的程式碼抽出來放在不同的檔案中來形成模組(Module),主程式再透過引用的方式來使用。
所以,模組(Module)可以提高程式碼的重用性(Reusable)且易於維護。


模組的載入與使用

語法

  • 寫法一

      #載入模組
      import module_name
    
      #使用模組的變數
      module_name.var
    
      #使用模組的函式
      module_name.func([parameters])
    
      import math
    
      a = math.pi
      b = math.sqrt(4)
    
      print(a, b)
    
  • 寫法二

      #載入模組
      import module_name as alias
    
      #使用模組的變數
      alias.var
    
      #使用模組的函式
      alias.func([parameters])
    
      import math as m
    
      a = m.pi
      b = m.sqrt(4)
    
      print(a, b)
    

模組類型介紹

內建模組

  • 這類的模組在安裝 Python 時就已經預先安裝,因此使用時不需再額外安裝,也稱為 Python 的標準程式庫(standard library)。
  • e.g.

    • os, sys, datetime, random 模組
    • os 模組:作業系統操作

        import os
      
        #取得檔案列表
        print(os.listdir('./'))
      
        #建立資料夾
        os.makedirs('./dir_test/')
      
    • sys 模組:取得系統相關的重要資訊

        import sys
      
        #當前的作業系統
        print(sys.platform)
      
        #整數型態的最大值
        print(sys.maxsize)
      
        #搜尋模組的路徑
        print(sys.path)
      

外部模組

  • 外部模組因不包含在 Python 的標準程式庫中,因此使用前必須先安裝,安裝完成後,導入的方法和導入 Python 內建模組完全相同。
  • e.g.

    • numpy, pandas, matplotlib 模組
    • numpy 模組:陣列操作

        $ pip install numpy
      
        import numpy as np
      
        a = np.array([1, 2, 3])
        b = np.array([2, 4, 6])
      
        print(np.add(a, b))
        #[3, 6, 9]
      

自訂模組

  • geometry 模組:定義平面幾何運算用的函式 (須自行定義 geometry.py)

      ### MainScript.py ###
      import geometry
    
      print(geometry.distance(1, 1, 5, 5))
    

MainScript.py 拆檔案 - 模組化

## MainScript.py ##

#計算兩點間的距離
def distance(x1, y1, x2, y2):
    return ((x2 - x1)**2 + (y2 - y1)**2)**0.5

#計算線段的斜率
def slope(x1, y1, x2, y2):
    return (y2 - y1)/(x2 - x1)

result1 = distance(1, 1, 5, 5)
result2 = slope(1, 2, 5, 6)

print(result1)        #5.656854249492381
print(result2)        #1.0

Step 1:新建 Module geometry.py

💡 sys.path
   Python 會搜尋模組的位置並印出。
   表示當我們要載入一個模組時,Python 到很多地方搜尋模組並載入。
   因此,若自訂的模組沒有放到搜尋的路徑中,則無法順利載入並使用模組!
  • geometry.py

    • MainScript.py 相同目錄階層

        #計算兩點間的距離
        def distance(x1, y1, x2, y2):
            return ((x2 - x1)**2 + (y2 - y1)**2)**0.5
      
        #計算線段的斜率
        def slope(x1, y1, x2, y2):
            return (y2 - y1)/(x2 - x1)
      
  • MainScript.py

      import geometry
    
      result1 = geometry.distance(1, 1, 5, 5)
      result2 = geometry.slope(1, 2, 5, 6)
    
      print(result1)      #5.656854249492381
      print(result2)      #1.0
    

Step 2:調整目錄架構(引入 Package 概念)

  • 建立資料夾 MyModules,並將 geometry.py 放入 資料夾 MyModules 內。
    • geometry.py 不需要修改
  • MainScript.py 需要新增模組的搜尋路徑

    • MainScript.py 與 資料夾 MyModules 置於同一階層。

        import sys
      
        #新增模組的路徑
        sys.path.append("MyModules")
        #print(sys.path)
      
        import geometry
      
        result1 = geometry.distance(1, 1, 5, 5)
        print(result1)
        #5.6568
      
        result2 = geometry.slope(1, 2, 5, 6)
        print(result2)
        #1.0
      

Step 3:自訂套件 (Package) geometry

💡 套件 = 封包 = package = 包含模組的『資料夾』
   套件 -> 把模組分門別類
   用於整理、分類模組程式碼,利用『資料夾』來整理。
   使用時機:當我們有 100 個以上的模組時,就需要對模組做分類整理。

💡 對應關係
   package (套件、封包) -> 『資料夾』
   module  (模組)      -> 『.py 檔案』

專案檔案配置

- 專案資料夾
    - MainScript.py
    - 套件資料夾
        - __init__.py
        - 模組一.py
        - 模組二.py

💡 含有 __init__.py 的資料夾,才會被當作是 套件(package)。

修改後

- 專案資料夾
    - MainScript.py
    - geometry (將 MyModules 更名為 geometry)
        - __init__.py
        - point.py (將 geometry.py 拆檔)
        - line.py  (將 geometry.py 拆檔)
  • __init__.py
    • 空檔案
  • point.py
      #計算兩點間的距離
      def distance(x1, y1, x2, y2):
          return ((x2 - x1)**2 + (y2 - y1)**2)**0.5
    
  • line.py
      #計算線段的斜率
      def slope(x1, y1, x2, y2):
          return (y2 - y1)/(x2 - x1)
    
  • MainScript.py 待下一步驟調整

Step 4:載入並使用套件

  • 語法

      import package_name.module_name
      or
      from package_name import module_name
    
      💡 注意!
         必須 import 套件.模組 ,這樣才能正常使用。
         切記,不可 import 套件 而已。
    
  • MainScript.py

    • 第一種寫法

        import geometry.point
        import geometry.line as line
      
        result1 = geometry.point.distance(1, 1, 5, 5)
        result2 = line.slope(1, 2, 5, 6)
      
        print(result1)        #5.656854249492381
        print(result2)        #1.0
      
    • 第二種寫法

        from geometry import point, line
      
        result1 = point.distance(1, 1, 5, 5)
        result2 = line.slope(1, 2, 5, 6)
      
        print(result1)        #5.656854249492381
        print(result2)        #1.0
      

References

  1. 解析Python模組(Module)和套件(Package)的概念

#Python #module #package







Related Posts

VQA Challenge 2021 - 第三名心得

VQA Challenge 2021 - 第三名心得

React 又肥又慢,為什麼我還要用它?

React 又肥又慢,為什麼我還要用它?

原型繼承與原型鏈(待補筆記)

原型繼承與原型鏈(待補筆記)


Comments